package com.prj.ufdm.demo.tutorial.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Condition是在java 1.5中才出现的，它用来替代传统的Object的wait()、notify()实现线程间的协作，相比使用Object的wait()、notify()，使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition，阻塞队列实际上是使用了Condition来模拟线程间协作。
   Condition是个接口，基本的方法就是await()和signal()方法；
   Condition依赖于Lock接口，生成一个Condition的基本代码是lock.newCondition() 
      调用Condition的await()和signal()方法，都必须在lock保护之内，就是说必须在lock.lock()和lock.unlock之间才可以使用
　  Conditon中的await()对应Object的wait()；
　  Condition中的signal()对应Object的notify()；
   Condition中的signalAll()对应Object的notifyAll()。
 * @author Administrator
 *
 */
public class TestCondition {

	final Lock lock = new ReentrantLock();  
    final Condition condition = lock.newCondition(); 
    
	public static void main(String[] args) {
		TestCondition testCondition = new TestCondition();
		TCThreadA tcThreadA = testCondition.new TCThreadA();
		tcThreadA.start();
		TCThreadB tcThreadB = testCondition.new TCThreadB();
		tcThreadB.start();
	}
	
	class TCThreadA extends Thread {

		@Override
		public void run() {
			print();
		}

		private void print() {
			try 
			{
				lock.lock();
				System.out.println("A-获得锁，A-执行完成，A-线程休眠");
				condition.await();
				System.out.println("A-继续执行 ");
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				System.out.println("A-释放锁 ");
				lock.unlock();
			}
		}
	}  
	
	class TCThreadB extends Thread {
		@Override
		public void run() {
			print();
		}
		private void print() {
			try {
				lock.lock();
				System.out.println("B-获得锁，B-执行完成，B-唤醒A");
				condition.signalAll();
			} finally {
				System.out.println("B-释放锁 ");
				lock.unlock();
			}
		}
	}

}
